package com.castday2.castday2.test;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.castday2.castday2.bean.User;
import com.castday2.castday2.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @Author : 徐闯 mpcast
 * @Date : 2021-05-24 12:05:06
 * @Description : 测试更新操作
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class B_TestUpdate {
    @Autowired
    private UserMapper userMapper;
    // 根据id删除  不需要条件构造器 只要在方法中传入实体对象即可
    @Test
    public void test1(){
        User user = new User();
        user.setAge(100);
        user.setId(1001);
        int n = userMapper.updateById(user);
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
    // 根据姓名 修改年龄和邮箱信息
    @Test
    public void test2(){
        User user = new User();
        user.setEmail("cxb_xuc@163.com");
        user.setAge(20);
        // 第一个参数为实体的实例  实例中非空属性作为set后面修改的内容
        // 第二个参数为条件构造器 作为 where后面的条件
        int n = userMapper.update(user,Wrappers.<User>update()
                .eq("age",19)
        );
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
    // 根据姓名修改年龄和邮箱信息
    @Test
    public void test3(){
        // 第一个为null
        // 第二个参数为条件构造器 作为 where后面的条件
        // 通过调用set方法 确定需要修改的列和值
        int n = userMapper.update(null,Wrappers.<User>update()
            .eq("age",20)
            .set("email","xx@xx.com")
            .set("name","xc")
        );
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
    // 引入LambdaUpdate
    public void test4(){
        // 和QueryLambdaWrapper类似 为了提高代码的安全性 规避运行时列名报错的问题
        int n = userMapper.update(null,Wrappers.<User>lambdaUpdate()
                .eq(User::getAge,20)
                .set(User::getEmail,"xx@xx.com")
                .set(User::getName,"xc")
        );
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
    //引入condition 实现动态修改
    @Test
    public void test5(){
        String email = " ";
        String name = " xc ";
        // 和QueryLambdaWrapper类似 为了提高代码的安全性 规避运行时列名报错的问题
        int n = userMapper.update(null,Wrappers.<User>lambdaUpdate()
                .eq(User::getAge,20)
                .set(email!=null&&(!email.trim().equals("")),User::getEmail,email)
                .set(StringUtils.isNotBlank(name),User::getName,name.trim())
        );
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
    //引入实体作为Wrapper 参数的情况
    // 实例的非空字段会进行 等于比较 此处存在 bug
    // 比如 年龄 字段 定义为 int类型 默认为 0 不是空  不给年龄set值 也会参与比较
    // 所以 建议将实体的基本类型 重构成 对应的包装类型
    @Test
    public void test6(){
        String email = " ";
        String name = " xc ";
        User user = new User();
        user.setId(1005);
        // 和QueryLambdaWrapper类似 为了提高代码的安全性 规避运行时列名报错的问题
        int n = userMapper.update(null,Wrappers.<User>lambdaUpdate(user)
                .eq(User::getAge,20)
                .set(email!=null&&(!email.trim().equals("")),User::getEmail,email)
                .set(StringUtils.isNotBlank(name),User::getName,name.trim())
        );
        System.out.println("受影响的数据的条数为 ===> "+n);
    }
}
